package c_thread_security;

/**
 * 测试类，用于演示多线程同步问题。
 * 通过创建多个线程共同操作一个共享资源（售票对象），来展示同步控制的重要性。
 */
public class test01 {

    public static void main(String[] args) {
        myThread t1 = new myThread();

        // 使用同一个售票对象创建三个售票窗口线程
        Thread t2 = new Thread(t1, "窗口1");
        Thread t3 = new Thread(t1, "窗口2");
        Thread t4 = new Thread(t1, "窗口3");

        // 启动三个售票窗口线程
        t2.start();
        t3.start();
        t4.start();
    }
}

/**
 * 模拟售票窗口的线程类。
 * 每个实例都可以作为一个售票窗口，进行售票操作。
 */
class myThread extends Thread {
    int ticket = 100; // 售票数量

    /**
     * 线程的运行方法，用于模拟售票过程。
     * 通过循环不断进行售票操作，直到票数售完。
     */
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000); // 模拟售票动作的间隔时间

                synchronized (this) {
                    // 在同步块中进行售票操作，保证线程安全
                    if (ticket > 0) {
                        System.out.println(Thread.currentThread().getName() + "正在买第" + ticket + "张票");
                        ticket--; // 出售一张票
                    }
                    if (ticket == 0) {
                        System.out.println("票已售完");
                        break; // 票售完后结束线程
                    }
                }
            } catch (InterruptedException e) {
                // 处理线程中断异常
                throw new RuntimeException(e);
            }
        }
    }
}
